import time
import datetime

from config import Config
from flask_sqlalchemy import SQLAlchemy
import logging
import os
from logging.handlers import RotatingFileHandler, TimedRotatingFileHandler
import redis

from flask import Flask
from flask_socketio import SocketIO

# from flask_cors import CORS
"""
项目的主软件包，
对app进行初始化
"""
app = Flask(__name__)
app.config.from_object(Config)
socketio = SocketIO(app, cors_allowed_origins="*")  # 必须存在这个实例
# socket初始化
# 主路由定义（如果需要）
# 确保其他模块能获取到实例
__all__ = ['app', 'socketio', 'redis_client','db','file_handler','redis_ready']
# 日志
logger = logging.getLogger(__name__)
file_handler=None
# 配置日志
def setup_logging():
    # 创建logs目录（如果不存在）
    if not os.path.exists('logs'):
        os.mkdir('logs')

    # 设置日志格式
    formatter = logging.Formatter(
        '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
    )
    global file_handler
    global redis_ready
    try:
        if redis_ready:
            days=redis_client.get("log_remain_days")
            if not days:
                days=30
            else:
                days=int(days)
        else:
            days=30
    except:
        days=30

        redis_ready = False
    # 使用 TimedRotatingFileHandler 按天分割日志
    file_handler = TimedRotatingFileHandler(
        'logs/app.log',  # 基础日志文件名
        when='midnight',  # 分割时间点：午夜（可选值：'S'秒、'M'分、'H'小时、'D'天、'W0'-'W6'周几）
        interval=1,      # 间隔周期（配合when使用，默认1）
        backupCount=days,  # 保留最近30天的日志文件
        encoding='utf-8',
        atTime=datetime.time(0, 0, 0)  # 可选：指定分割时间（默认为午夜0点）
    )
    file_handler.setFormatter(formatter)
    file_handler.setLevel(logging.INFO)

    # 设置控制台处理器
    console_handler = logging.StreamHandler()
    console_handler.setFormatter(formatter)
    console_handler.setLevel(logging.INFO)

    # 获取根日志记录器
    root_logger = logging.getLogger()
    root_logger.setLevel(logging.INFO)

    # 添加处理器
    root_logger.addHandler(file_handler)
    root_logger.addHandler(console_handler)


db = SQLAlchemy(app)

redis_ready=False
# 连接redis
try:
    pool = redis.ConnectionPool(
        host=Config.REDIS_CONFIG['host'],
        port=Config.REDIS_CONFIG['port'],
        password=Config.REDIS_CONFIG['password'],
        db=Config.REDIS_CONFIG['db'],
        decode_responses=True
    )

    redis_client = redis.Redis(connection_pool=pool)
    redis_client.hset('systemInfo', 'start_time', str(time.time()))
    logger.info('redis数据库连接成功')
    redis_ready = True
except Exception as e:
    logger.error("连接redis数据库失败")


def set_redis_error():
    global redis_ready
    redis_ready = False

# 初始化日志系统
setup_logging()
# 确保在上下文中导入模型
with app.app_context():
    db.reflect()  # 反射所有表
    from . import models  # 导入模型文件

# 导入该文件，使拦截器生效
import app.interceptor as interceptor

# 导入路由
from app.routes.user_route import user_bp

app.register_blueprint(user_bp, url_prefix='/user')

from app.routes.house_route import house_bp

app.register_blueprint(house_bp, url_prefix='/house')

from app.routes.chat_route import chat_bp

app.register_blueprint(chat_bp, url_prefix='/chat')

from app.routes.monitor_route import monitor_bp

app.register_blueprint(monitor_bp, url_prefix='/monitor')

# TODO 后面写的路由包要导入
